翻译 Region of interest pooling explained
原文链接:
https://deepsense.io/region-of-interest-pooling-explained/
Introduction
感兴趣区域池化(也称作RoI pooling)是一个广泛应用在目标检测任务的卷积神经网络中的操作。它的目的是对不规范的输入进行max pooling,以获得固定尺寸的feature maps(例如7×7)。
我们开源了TensorFlow下的RoI Pooling实现。(https://github.com/deepsense-io/roi-pooling)。在本文中,我们将要简单介绍这个有趣的神经网络层。在这之前,我们先从背景开始。
计算机视觉的两个主要任务是目标分类和目标检测(追踪表示不开心 ̄へ ̄)。前者系统需要对一幅图像中的显著物体进行分类标记。后者则需要在一幅图像中,对于所有的物体给出正确的标记和位置信息。当然还有一些其他有趣的计算机视觉领域,如图像分割,但今天我们只关心检测。在这个任务中,我们通常应该在所有目标旁画上bounding box,依据之前指定的类别集合,给他们分配一个类别。例如,假设我们正在开发自动驾驶的算法,我们就需要相机检测其他的汽车、行人、骑车的人等等。
在这种情况下,我们必须需在每个重要的目标周围画一个box,分配一个类别给它。这个任务比在MNIST或CIFAR上的分类任务要更有挑战性。视频的每一帧中,可能有多个目标,一些发生重叠,一些难以看清,一些则被遮挡。另外,对于这样一个算法,performance是一个关键的问题。尤其对于自动驾驶,我们必须每秒处理数十帧图像。
所以,我们该如何解决这个问题呢?
Typical architecture
我们今天将要讨论的目标检测架构主要分为两个步骤:
1、 Region Proposal: 给定一个输入图像,找出所有目标可能存在的位置。这个阶段的输出应该是一个bounding box的列表,列出所有可能存在目标的位置。这些通常被叫做region proposal或regions of interest。针对这个任务有一些方法,本文中不再讨论。
2、 Final classification: 对于来自前一阶段的每一个region proposal, 判断其属于目标类别中的某一类或是属于背景。这里我们可能会使用一个深度卷积网络。
通常在proposal环节,我们必须要产生大量的region of interest。为什么呢?如果一个目标在第一个阶段没有被检测出来,那么就不可能在第二个环节把它正确的分类。这就是为什么region proposals必须要有很高的查全率(recall)。这通常通过产生非常大量的proposals来实现(例如,每帧几千个)。他们中的大多数会在检测算法的第二个环节被分类为背景。
这种结构的一些问题有:
- 产生大量的regions of interest可能会导致性能问题。这将使得实时的目标检测难以实现。
- 这是处理速度方面的次优选择。后面会详细讲。
- 不能实现端到端训练。也就是说,你不能在一次运行中训练系统所有的部分(这样能够产生更好的结果)。
这就是RoI Pooling为什么被提出了。
Region of interest pooling - description
Region of interest pooling是一个用于目标检测任务的神经网络层。它由Ross Girshick在2015年四月首次提出,在训练和测试中都显著的提升了速度。它还维持了检测的高精度。这个层有两个输入:
- 从具有多个卷积和最大池化层的深度卷积网络中获得的固定大小的feature map。
- 一个N×5的矩阵,表示感兴趣区域的列表,这里N是RoIs的数量。第一列表示图像下标,剩下的四个是左上和右下教的坐标。
RoI Pooling实际上做了什么?对于输入列表中的每个感兴趣区域,它从输入feature map中截取对应的部分,并把它缩放到某个预训练的大小(比如7×7)。缩放通过如下完成:
- 1、把region proposal划分成等大小的部分(其数目等同于输出的维度)。
- 2、找出每个部分的最大值。
- 3、把这些最大值复制到输出缓存中。
结果就是,从一列的不同大小的矩形,我们可以快速的得到对应的固定大小的feature maps。注意RoI Pooling的输出维度实际上并不依赖于输入feature map的大小,也不依赖于region proposal的大小。它仅仅决定于我们把proposal划分成几个部分。
RoI pooling的好处是什么?其中一个就是处理速度。如果一帧中有多个目标的proposals,我们依然可以对它们用同样的输入feature map。由于前期阶段的卷积操作计算量非常大,这种方法能够节省我们大量时间。
Region of interest pooling - example
让我们来看看一个小例子如何工作。我们将在一个8×8的feature map上进行RoI pooling的操作,只有一个感兴趣区域,输出大小为2×2。输入特征图长这样:
假设我们有个region proposal:(0,3) (7,8)在图中看起来是这样:
通常,会有多个feature maps和多个proposal。但这里我们想让例子简单一些。
通过把它划分成(2×2)的部分,我们得到:
注意感兴趣区域的大小并不需要能被划分数目整除。
每个部分的最大值如下:
如下为RoI Pooling层的输出。
关于RoI pooling需要记住的最重要的是什么?
- 它用在目标检测任务中
- 它允许我们在卷积网络中复用feature map
- 它能够明显加速训练和测试
- 它允许以一种端到端的方式训练目标检测系统